package com.crm.service.impl.opportunityManager;

import com.crm.common.model.Enum.StatusCodeEnum;
import com.crm.dao.mapper.customMapper.opportunityManagerCustomMapper.OpportunityCustomMapper;
import com.crm.dao.mapper.opportunityManager.OpportunityMapper;
import com.crm.model.entity.customerManager.CustomerReturn;
import com.crm.model.entity.customerManager.CustomerReturnExample;
import com.crm.model.entity.opportunityManager.Opportunity;
import com.crm.model.entity.opportunityManager.OpportunityExample;
import com.crm.model.qo.opportunityManager.OpportunityQO;
import com.crm.model.qo.opportunityManager.OpportunityStatusQO;
import com.crm.model.vo.customerManager.CustomerVO;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import com.crm.model.vo.opportunityManager.*;
import com.crm.service.opportunityManager.OpportunityDbService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 商机管理信息
 */
@Service
public class OpportunityDbServiceImpl implements OpportunityDbService {
    @Autowired
    private OpportunityMapper opportunityMapper;

    @Autowired
    private OpportunityCustomMapper opportunityCustomMapper;

    /**
     * 商机管理信息--超级管理员
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    @Override
    public List<OpportunityVO> selectOpportunityGlyList(OpportunityQO opportunityQO, String sortOrder,Integer dateUnit) {
        return opportunityCustomMapper.selectOpportunityGlyList(opportunityQO, sortOrder,dateUnit);
    }

    /**
     * 商机管理信息--分公司管理员
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    @Override
    public List<OpportunityVO> selectOpportunityFgsList(OpportunityQO opportunityQO, String sortOrder,Integer dateUnit) {
        return opportunityCustomMapper.selectOpportunityFgsList(opportunityQO, sortOrder,dateUnit);
    }

    /**
     * 商机管理信息--普通用户
     * @param opportunityQO
     * @param sortOrder
     * @return
     */
    @Override
    public List<OpportunityVO> selectOpportunityPtyhList(OpportunityQO opportunityQO, String sortOrder,Integer dateUnit) {
        return opportunityCustomMapper.selectOpportunityPtyhList(opportunityQO, sortOrder,dateUnit);
    }


    /**
     * 修改商机管理表--修改商机状态
     * @param opportunity
     * @return
     */
    @Override
    public Boolean updateOpportunityId(Opportunity opportunity) {
        Boolean result = false;
        int num = opportunityMapper.updateByPrimaryKeySelective(opportunity);
        if(num>0){
            result = true;
        }
        return result;
    }

    /**
     * 商机管理-查询商机信息
     * @param opportunityId
     * @return
     */
    @Override
    public Opportunity selectByOpportunityId(String opportunityId) {
        return opportunityMapper.selectByPrimaryKey(opportunityId);
    }

    /**
     * 修改回显
     * @param opportunityId
     * @return
     */
    @Override
    public OpportunityCustomerVO getOpportunityId(String opportunityId) {
        OpportunityQO opportunityQO = new OpportunityQO();
        opportunityQO.setOpportunityId(opportunityId);
        opportunityQO.setDeleteStatus(Short.parseShort(String.valueOf(StatusCodeEnum.NORMAL_CODE.getState())));
        List<OpportunityCustomerVO> list = opportunityCustomMapper.opportunityByCustomerIdList(opportunityQO);
        if(list.size() == 0){
            return new OpportunityCustomerVO();
        }else {
            return list.get(0);
        }
    }

    /**
     * 修改客户管理的商机
     * @param opp
     * @return
     */
    @Override
    public Boolean updateOpportunity(Opportunity opp) {
        Boolean result = false;
        int num = opportunityMapper.updateByPrimaryKeySelective(opp);
        if(num>0){
            result = true;
        }
        return result;
    }

    /**
     * 商机管理-新增商机
     * @param opportunity
     * @return
     */
    @Override
    public Boolean addOpportunity(Opportunity opportunity) {
        Boolean result = false;
        int num = opportunityMapper.insertSelective(opportunity);
        if(num>0){
            result = true;
        }
        return result;
    }

    /**
     * 根据联系人id查询商机
     * @param contactId 联系人id
     * @param orderString 分组类型
     * @return
     */
    @Override
    public List<OpportunityVO> opportunityDetailList(String contactId, String orderString) {
        List<OpportunityVO> list = opportunityCustomMapper.opportunityDetailList(contactId,orderString);
        return list;
    }

    /**
     * 商机-商机详情-通过商机id查询
     * @param opportunityId 商机id
     * @return
     */
    @Override
    public OpportunityVO opportunityDetail(String opportunityId) {
        return opportunityCustomMapper.opportunityDetail(opportunityId);
    }

    @Override
    public List<Opportunity> selectOpportunityListByCustomerId(String customerId) {
        OpportunityExample opportunityExample = new OpportunityExample();
        OpportunityExample.Criteria criteria = opportunityExample.createCriteria();
        criteria.andCustomerIdEqualTo(customerId);
        //只查询赢单状态的商机
        //商机状态 1: 初步洽谈 2: 需求确定 3: 方案报价 4: 谈判 5: 洽谈合同 6: 赢单 7: 输单
        criteria.andOpportunityStatusEqualTo("6");
        criteria.andOpportunityContractTypeEqualTo("0");
        criteria.andDeleteStatusEqualTo(Short.parseShort(String.valueOf(StatusCodeEnum.NORMAL_CODE.getState())));
        opportunityExample.setOrderByClause("create_tm desc");
        List<Opportunity> list = opportunityMapper.selectByExample(opportunityExample);
        return list;
    }

    /**
     *
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param dateUnit  1本月 2本季度 3本年
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public List<OpportunityStatusVO> oppStatusStatistics(String name,Integer number, Integer dateUnit, String startTime, String endTime,String superAccountId) {
        return opportunityCustomMapper.oppStatusStatistics(name,number,dateUnit,startTime,endTime,superAccountId);
    }

    /**
     * 商机产品比重
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param dateUnit  1本月 2本季度 3本年
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public List<OpportunityProductVO> oppProductStatistics(String name,Integer number,Integer dateUnit,String superAccountId) {
        return opportunityCustomMapper.oppProductStatistics(name,number,dateUnit,superAccountId);
    }

    /**
     * 管理模块 --商机分布--商机列表
     * @param name 登录人
     * @param number 0超管 1普通管理员  2普通用户
     * @param dateUnit 1本月 2本季度 3本年
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public List<OpportunityStatisticsVO> selectOppStatistics(String name, Integer number, Integer dateUnit,String superAccountId) {
        return opportunityCustomMapper.selectOppStatistics(name,number,dateUnit,superAccountId);
    }

    /**
     * 根据客户ID更新商机所有人ID、分公司ID
     * @Author pym
     * @Date  2021/4/8 15:26
     * @param customerId -客户ID
     * @param accountId -用户ID
     * @param companyId -公司ID
     * @param updatePeopleId -更新人ID
     * @param updateTm -更新时间
     * @return {@link {java.lang.Boolean}}
     */
    @Override
    public Boolean updateOpportunityByCustomerId(String customerId, String accountId, String companyId,
                                                 String updatePeopleId, Date updateTm) {
        return opportunityCustomMapper.updateOpportunityByCustomerId(customerId,accountId,companyId,updatePeopleId,updateTm) > 0;
    }

    /**
     * 通过商机id带出来合同需要的数据
     * @param opportunityId 商机id
     * @return
     */
    @Override
    public OpportunityContractDetailVO opportunityContractDetail(String opportunityId) {
        return opportunityCustomMapper.opportunityContractDetail(opportunityId);
    }

    /**
     * 管理员-商机状态统计
     * @param opportunityStatusQO dateType thisLastMonth 上月  thisMonth 本月 thisQuarter 本季度  thisYear 本年  section 区间
     * @param opportunityStatusQO startTime 起始时间
     * @param opportunityStatusQO endTime 截止时间
     * @return
     */
    @Override
    public List<OpportunityStatusVO> adminOppStatusStatistics(OpportunityStatusQO opportunityStatusQO) {
        return opportunityCustomMapper.adminOppStatusStatistics(opportunityStatusQO);
    }

    /**
     * 管理员-业绩排名
     * @param opportunityStatusQO dateType thisLastMonth 上月  thisMonth 本月 thisQuarter 本季度  thisYear 本年  section 区间
     * @param opportunityStatusQO startTime 起始时间
     * @param opportunityStatusQO endTime 截止时间
     * @return
     */
    @Override
    public List<PerformanceRankingVO> performanceRanking(OpportunityStatusQO opportunityStatusQO) {
        return opportunityCustomMapper.performanceRanking(opportunityStatusQO);
    }

    /**
     * 查询成交额度
     * @param dateUnit  1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public BigDecimal selectTransactionAmount(int dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.selectTransactionAmount(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 查询会员新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public Integer selectNewMembers(int dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.selectNewMembers(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 查询商机新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public Integer selectNewOpportunity(int dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.selectNewOpportunity(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 查询赢单新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public Integer selectNewWinOrder(int dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.selectNewWinOrder(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 查询待回款额度
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public BigDecimal selectAmountReturned(int dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.selectAmountReturned(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 查询联系人新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public Integer selectNewContact(int dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.selectNewContact(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 查询电话量新增
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public Integer selectNewCallVolume(int dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.selectNewCallVolume(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 商机合同占比
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public List<OpportunityProductVO> oppContractProportion(Integer dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.oppContractProportion(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 商机合同类型比例
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public List<OpportunityProductVO> oppContractTypeProportion(Integer dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.oppContractTypeProportion(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 商机成交额比例
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public List<OpportunityProductVO> oppTurnoverProportion(Integer dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.oppTurnoverProportion(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 商机拥有数排行
     * @param bs 1赢单排行  2总数排行
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public List<OpportunityOfNumberVO> oppOfNumber(Integer bs,Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.oppOfNumber(bs,number,companyId,superAccountId);
    }

    /**
     * 商机状态个数跟进占比意向占比
     * @param dateUnit 1上月 2本周 3本月
     * @param number 0超管 1普通管理员
     * @param companyId 公司id
     * @param superAccountId 超管id
     * @return
     */
    @Override
    public List<OpportunityFollowIntentionZbVO> opportunityFollowIntentionZb(Integer dateUnit, Integer number, String companyId,String superAccountId) {
        return opportunityCustomMapper.opportunityFollowIntentionZb(dateUnit,number,companyId,superAccountId);
    }

    /**
     * 个人业绩下的商机分析数量
     * @param dateUnit 1本月 2本季度 3本年
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param accountId 用户id
     * @return
     */
    @Override
    public List<OpportunityStatusVO> oppStatusStatisticsAdmin(Integer dateUnit, String startTime, String endTime, String accountId) {
        return opportunityCustomMapper.oppStatusStatisticsAdmin(dateUnit,startTime,endTime,accountId);
    }

    /**
     * 商机管理   ----协作人
     * @param opportunityQO
     * @param sortOrder
     * @param dateUnit
     * @return
     */
    @Override
    public List<OpportunityVO> selectOpportunityXzrList(OpportunityQO opportunityQO, String sortOrder, Integer dateUnit) {
        return opportunityCustomMapper.selectOpportunityXzrList(opportunityQO,sortOrder,dateUnit);
    }

    /**
     * 查询自己的商机总条数
     * @param opportunityQO
     * @param dateUnit
     * @return
     */
    @Override
    public Integer selectOpportunityPtyhListCount(OpportunityQO opportunityQO, Integer dateUnit) {
        return opportunityCustomMapper.selectOpportunityPtyhListCount(opportunityQO,dateUnit);
    }

    /**
     * 查询自己协作的商机总条数
     * @param opportunityQO
     * @param dateUnit
     * @return
     */
    @Override
    public Integer selectOpportunityXzrListCount(OpportunityQO opportunityQO, Integer dateUnit) {
        return opportunityCustomMapper.selectOpportunityXzrListCount(opportunityQO,dateUnit);
    }


    /**
     * @Description: 根据商机名称查询数据
     * @Param: [opportunityName]
     * @Return: java.util.List<com.crm.model.vo.datasearch.DataSearchResultVO>
     * @Author: lixq-f
     * @Date: 2021/5/13
     **/
    @Override
    public List<DataSearchResultVO> selectDataByOpportunityName(String opportunityName) {
        return opportunityCustomMapper.selectDataByOpportunityName(opportunityName);
    }
}
